স্প্রিং বুট ক্লায়েন্টে অ্যাসিনক্রোনাস প্রোগ্রামিং এবং নন-ব্লকিং কলের জন্য CompletableFuture এবং Mono/Flux অত্যন্ত গুরুত্বপূর্ণ। এই দুটি পদ্ধতি পৃথকভাবে কাজ করে, তবে উভয়ই অ্যাসিনক্রোনাস ডেটা প্রসেসিংয়ের জন্য ব্যবহৃত হয়।
CompletableFuture হলো Java 8-এর একটি ফিচার যা অ্যাসিনক্রোনাস টাস্ক চালানোর জন্য ব্যবহার হয়। এটি ব্লকিং নয় এবং ভবিষ্যতে একটি রেসপন্স রিটার্ন করবে।
import java.util.concurrent.CompletableFuture;
public CompletableFuture<String> fetchDataAsync(String url) {
return CompletableFuture.supplyAsync(() -> {
// এখানে HTTP কল বা অন্য কোনো অ্যাসিনক্রোনাস কাজ করুন
return "Response from " + url;
});
}
import org.springframework.stereotype.Service;
import java.util.concurrent.CompletableFuture;
@Service
public class ApiClient {
public CompletableFuture<String> getData(String url) {
return CompletableFuture.supplyAsync(() -> {
// HTTP কল (RestTemplate বা WebClient ব্যবহার করুন)
return "Fetched Data from " + url;
});
}
}
ApiClient client = new ApiClient();
CompletableFuture<String> futureResponse = client.getData("https://api.example.com/data");
futureResponse.thenAccept(response -> {
System.out.println("Response: " + response);
}).exceptionally(ex -> {
System.err.println("Error occurred: " + ex.getMessage());
return null;
});
Mono এবং Flux হলো Spring WebFlux-এর অংশ, যা রিয়াক্টিভ প্রোগ্রামিং মডেলে কাজ করে।
import reactor.core.publisher.Mono;
public Mono<String> fetchDataMono(String url) {
return Mono.just("Response from " + url);
}
import reactor.core.publisher.Flux;
public Flux<String> fetchDataFlux() {
return Flux.just("Data1", "Data2", "Data3");
}
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
@Service
public class ApiClient {
private final WebClient webClient;
public ApiClient(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl("https://api.example.com").build();
}
public Mono<String> getData(String endpoint) {
return this.webClient.get()
.uri(endpoint)
.retrieve()
.bodyToMono(String.class);
}
public Flux<String> getMultipleData(String endpoint) {
return this.webClient.get()
.uri(endpoint)
.retrieve()
.bodyToFlux(String.class);
}
}
ApiClient client = new ApiClient(WebClient.builder());
client.getData("/data").subscribe(response -> {
System.out.println("Response: " + response);
}, error -> {
System.err.println("Error: " + error.getMessage());
});
বৈশিষ্ট্য | CompletableFuture | Mono/Flux |
---|---|---|
মডেল | Imperative | Reactive |
নন-ব্লকিং | হ্যাঁ | হ্যাঁ |
অ্যাপ্লিকেশন স্কোপ | Java স্ট্যান্ডার্ড ল্যাঙ্গুয়েজ | Spring WebFlux এবং Reactive |
ডেটা টাইপ | CompletableFuture | Mono, Flux |
ডেটা ফ্লো | একক রেসপন্স | একক বা একাধিক রেসপন্স |
স্ট্রিম সাপোর্ট | নেই | আছে (Reactive Streams) |
Spring অ্যাপ্লিকেশনে CompletableFuture থেকে Mono-তে বা Mono থেকে CompletableFuture-এ রূপান্তর করা যেতে পারে।
import reactor.core.publisher.Mono;
public Mono<String> convertToMono(CompletableFuture<String> future) {
return Mono.fromFuture(future);
}
import reactor.core.publisher.Mono;
public CompletableFuture<String> convertToFuture(Mono<String> mono) {
return mono.toFuture();
}
public Mono<String> callTwoApis() {
Mono<String> api1Response = webClient.get().uri("/api1").retrieve().bodyToMono(String.class);
Mono<String> api2Response = webClient.get().uri("/api2").retrieve().bodyToMono(String.class);
return Mono.zip(api1Response, api2Response, (response1, response2) ->
"Combined Response: " + response1 + ", " + response2
);
}
public CompletableFuture<String> callTwoApisParallel() {
CompletableFuture<String> api1Future = CompletableFuture.supplyAsync(() -> webClient.get()
.uri("/api1")
.retrieve()
.bodyToMono(String.class)
.block());
CompletableFuture<String> api2Future = CompletableFuture.supplyAsync(() -> webClient.get()
.uri("/api2")
.retrieve()
.bodyToMono(String.class)
.block());
return api1Future.thenCombine(api2Future, (response1, response2) ->
"Combined Response: " + response1 + ", " + response2
);
}
স্প্রিং বুট ক্লায়েন্টে এই দুটি প্রযুক্তি ব্যবহার করে অ্যাপ্লিকেশনের স্কেল এবং কর্মক্ষমতা উল্লেখযোগ্যভাবে বৃদ্ধি করা যায়।
Read more